#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>
//strcpy
//char* my_strcpy(char* dest, const char* srt)
//{
//	assert(dest && srt);
//	char* ret = dest;
//	while ((*dest++ = *srt++))
//	{
//		;
//	}
//	return ret;
//}
//int main()
//{
//	char arr1[] = "ab cdefg";
//	char arr2[10] = { 0 };
//	char* ch = my_strcpy(arr2, arr1);
//	printf("%s", ch);
//	return 0;
//}sd
//strcat
//char* my_strcat(char* dest, const char* str)
//{
//	assert(dest && str);
//	char* ret = dest;
//	while (*dest)
//	{
//		dest++;
//	}
//	while ((*dest++ = *str++))
//	{
//		;
//	}
//	return ret;
//}
//int main()
//{
//	char arr1[30] = "i love you";
//	char arr2[] = "fengyuhan";
//	char* ch = my_strcat(arr1, arr2);
//	printf("%s ", ch); 
//	return 0;
//}
//strcmp
//int my_strcmp(const char* arr1, const char* arr2)
//{);
//	while (*arr1 == *arr
//	assert(arr1 && arr22)
//	{
//		if (!(*arr1))
//		{
//			return 0;
//		}
//		arr1++;
//		arr2++;
//	}
//	return (*arr1 - *arr2);
//}
//int main()
//{
//	char arr1[] = "abcdefg";
//	char arr2[] = "abq";
//	int r = my_strcmp(arr1, arr2);
//	printf("%d ", r);
//	return 0;
//}
//strstr           
//char* my_strstr(const char* e1, const char* e2)
//{
//	assert(e1 && e2);
//	if (!*e2)
//	{
//		return (char*)e1;
//	}
//	const char* q1 = NULL;
//	const char* q2 = NULL;
//	while (*e1)
//	{
//		q1 = e1;
//		q2 = e2;
//		while (*q1 && *q2 && *q1 == *q2)
//		{
//			q1++;
//			q2++;
//		}
//		if (!*q2)
//		{
//			return e1;
//		}
//		e1++;
//	}
//	return NULL;
//}
//int main()
//{
//	char arr1[] = "abc f cccpdd";
//	char arr2[] = "cpdd";
//	char* ch = my_strstr(arr1, arr2);
//	printf("%s ", ch);
//	return 0;
//}
//memcpy
//void* my_memcpy(void* dest, const void* srt, size_t num)
//{
//	assert(dest && srt);
//	void* ret = dest;
//	if (dest < srt)
//	{
//		while (num--)
//		{
//			*(char*)dest = *(char*)srt;
//			dest = (char*)dest + 1;
//			srt  = (char*)srt  + 1;
//		}
//	}
//	else
//	{
//		while (num--)
//		{
//			*((char*)dest + num) = *((char*)srt + num);
//		}
//	}
//    
//}
//int main()
//{
//	int arr1[] = { 1,2,3,4,5,6,7,8,9,0 };
//	int arr2[10] = { 0 };
//	size_t sz = sizeof(arr1) / sizeof(arr1[0]);
//	void* ret = my_memcpy(arr2, arr1,sizeof(arr1));
//	int i = 0;
//	for (i = 0; i < sz; i++)
//	{
//		printf("%d ", arr2[i]);
//	}
//	return 0;
//}
//memmove
//void* my_memmove(void* dest, const void* srt, size_t num)
//{
//	assert(dest && srt);
//	void* ret = dest;
//	if (dest < srt)
//	{
//		while (num--)
//		{
//			*(char*)dest = *(char*)srt;
//			dest = (char*)dest + 1;
//			srt  = (char*)srt  + 1;
//		}
//	}
//	else
//	{
//		while (num--)
//		{
//			*((char*)dest + num) = *((char*)srt + num);
//		}
//	}
//	return ret;
//}
//int main()
//{
//	int arr1[10] = { 1,2,3,4,5,6,7,8,9,0 };
//	int arr2[10] = { 0 };
//	size_t sz = sizeof(arr1) / sizeof(arr1[0]);
//	void* ret = my_memmove(arr2, arr1, sizeof(arr1));
//	int i = 0;
//	for (i = 0; i < sz; i++)
//	{
//	  printf("%d ", arr2[i]);
//	}
//	return 0;
//}
//bubble
//void exchange(void* buf1, void* buf2,size_t sum)
//{
//	assert(buf1 && buf2);
//	char ch = 0;
//	while (sum--)
//	{
//		ch = (*(char*)buf1);
//		(*(char*)buf1) = (*(char*)buf2);
//		(*(char*)buf2) = ch;
//		buf1 = (char*)buf1 + 1;
//		buf2 = (char*)buf2 + 1;
//	}
//}
//int int_cmp(const void* e1,const void* e2)
//{
//	assert(e1 && e2);
//	return (*(int*)e1) - (*(int*)e2);
//}

////void scanf_arr(int* arr, size_t sz)
////{
////	assert(arr);
////	int i = 0;
////	for (i = 0; i < sz; i++)
////	{
////		scanf("%d", arr[i]);
////	}
////}
//void test()
//{
//	int arr[] = {4,2,6,1,8,3,9,0,5,7};
//	size_t sz = sizeof(arr) / sizeof(arr[0]);
//	//scanf_arr(arr, sz);
//	bubble_sort(arr, sz, sizeof(arr[0]), int_cmp);
//	print_arr(arr, sz);
//}
//int main()
//{
//	test();
//	return 0;
//}
////void exchange(void* bf1, void* bf2,size_t sz)
//{
//	assert(bf1 && bf2);
//	char ch = 0;
//	while (sz--)
//	{
//		ch = (*(char*)bf1);
//		(*(char*)bf1) = (*(char*)bf2);
//		(*(char*)bf2) = ch;
//		bf1 = (char*)bf1 + 1;
//		bf2 = (char*)bf2 + 1;
//	}
//}
//int int_cmp(void* e1, void* e2)
//{
//	return (*(int*)e1 - *(int*)e2);
//}
//
//void bubble(void* e, size_t sz, size_t size, int(*fun)(void*, void*))
//{
//	assert(e);
//	int i = 0;
//	int j = 0;
//	for (i = 0; i < sz - 1; i++)
//	{
//		for (j = 0; j < sz - 1 - i; j++)
//		{
//			if (fun(((char*)e + j * size), ((char*)e + ((j + 1) * size))) > 0)
//			{
//				exchange(((char*)e + j * size), ((char*)e + ((j + 1) * size)),size);
//			}
//		}
//	}
//}
//void exchange(void* buf1, void* buf2, size_t sum)
//{
//	assert(buf1 && buf2);
//	char ch = 0;
//	while (sum--)
//	{
//		ch = *(char*)buf1;
//		*(char*)buf2 = *(char*)buf1;
//		*(char*)buf1 = ch;
//		buf1 = (char*)buf1 + 1;
//		buf2 = (char*)buf2 + 1;
//	}
//}
//int int_cmp(const void* e1, const void* e2)
//{
//	assert(e1 && e2);
//	return (*(int*)e1) - (*(int*)e2);
//}
//void bubble_sort(void* arr, size_t num, size_t size, int(*fun)(void*, void*))
//{
//	assert(arr);
//	int i = 0;
//	int j = 0;
//	for (i = 0; i < num - 1; i++)
//	{
//		for (j = 0; j < num - 1 - i; j++)
//		{
//			if (fun(((char*)arr + j * size), ((char*)arr + (j + 1) * size)) > 0)
//			{
//				exchange(((char*)arr + j * size), ((char*)arr + (j + 1) * size), size);
//			}
//		}
//	}
//}
////void exchange(void* bf1, void* bf2,size_t sz)
////{
////	assert(bf1 && bf2);
//	char ch = 0;
//	while (sz--)
//	{
//		ch = (*(char*)bf1);
//		(*(char*)bf1) = (*(char*)bf2);
//		(*(char*)bf2) = ch;
//		bf1 = (char*)bf1 + 1;
//		bf2 = (char*)bf2 + 1;
//	}
////}
void exchange(void* buf1, void* buf2, size_t sum)
{
	assert(buf1 && buf2);
	char ch = 0;
	while (sum--)
	{
		ch = (*(char*)buf1);
		(*(char*)buf1) = (*(char*)buf2);
		(*(char*)buf2) = ch;
		buf1 = (char*)buf1 + 1;
		buf2 = (char*)buf2 + 1;
	}
}
void bubble_sort(void* arr, size_t num, size_t size, int(*fun)(void*, void*))
{
	assert(arr);
	int i = 0;
	int j = 0;
	for (i = 0; i < num - 1; i++)
	{
		for (j = 0; j < num - 1 - i; j++)
		{
			if (fun(((char*)arr + j * size), ((char*)arr + (j + 1) * size)) > 0)
			{
				exchange(((char*)arr + j * size), ((char*)arr + (j + 1) * size), size);
			}
		}
	}
}
//void bubble_sort(void* arr, size_t num, size_t size, int(*fun)(void*, void*))
//{
//	assert(arr);
//	int i = 0;
//	int j = 0;
//	for (i = 0; i < num - 1; i++)
//	{
//		for (j = 0; j < num - 1 - i; j++)
//		{
//			if (fun(((char*)arr + j * size), ((char*)arr + (j + 1) * size)) > 0)
//			{
//				exchange(((char*)arr + j * size), ((char*)arr + (j + 1) * size), size);
//			}
//		}
//	}
//}